﻿//MenuInfo.h

#ifndef MENUINFO_H
#define MENUINFO_H

#include "db_cfg_g_def.h"
#include "DbCfgFun.h"

#pragma once

#pragma  pack(1)

typedef struct _ItemMenu
{
	int	ActVal;
	char	*pDisplayText;
	int	ErrVal;							//当ERR>=1 时，有效
	char	*pErrText;
	_ItemMenu()
	{
		ActVal = 0;
		ErrVal = 0;
		pDisplayText = NULL;
		//memset(DisplayText, 0 , STRING_NORMAL_LEN);
		pErrText = NULL;
	}
	~_ItemMenu()
	{
		if (pDisplayText)
		{
			delete [](char*)pDisplayText;
			pDisplayText = NULL;
		}
		if (pErrText)
		{
			delete [](char*)pErrText;
			pErrText = NULL;
		}
	}

	int SetDisText(char*pBuff, int buffLen)
	{
		if (!pBuff)
		{
			return -1;
		}
		if (buffLen<=0)
		{
			buffLen = STRING_NORMAL_LEN;
		}
		clearDisText();
		pDisplayText = new char[buffLen];
		memset(pDisplayText, 0, buffLen);
		memcpy(pDisplayText, pBuff, buffLen);
		return buffLen;
	}

	int SetErrText(char*pBuff, int buffLen)
	{
		if (!pBuff)
		{
			return -1;
		}
		if (buffLen<=0)
		{
			buffLen = STRING_NORMAL_LEN;
		}
		clearErrText();
		pErrText = new char[buffLen];
		memset(pErrText, 0, buffLen);
		memcpy(pErrText, pBuff, buffLen);
		return buffLen;
	}
	void clearDisText()
	{
		if (pDisplayText)
		{
			delete [](char*)pDisplayText;
			pDisplayText = NULL;
		}
	}
	void clearErrText()
	{
		if (pErrText)
		{
			delete [](char*)pErrText;
			pErrText = NULL;
		}
	}

}ItemMenu;

typedef struct _Field_Menu
{
	int		 ColumnId;
	ItemMenu	 *pMenu;
	int		 menuNum;
	_Field_Menu()
	{
		ColumnId = 0;
		pMenu = NULL;
		menuNum = 0;
	}
	~_Field_Menu()
	{
		if (pMenu)
		{
			delete []pMenu;
			pMenu = NULL;
		}
	}
}Field_Menu;

typedef struct _Relate_Menu
{
	int		 RelateAppType;
	int		 RelateTableId;
//	int		 RelateColId;
	char		 RelateColName[COLUMN_ENG_NAME_LEN];
	char		 RelateRSColName[COLUMN_ENG_NAME_LEN];
	ItemMenu	 *pMenu;
	int		 menuNum;
	_Relate_Menu()
	{
		RelateAppType = 0;
		RelateTableId = 0;
//		RelateColId = 0;
		memset(RelateColName, 0, COLUMN_ENG_NAME_LEN);
		memset(RelateRSColName, 0, COLUMN_ENG_NAME_LEN);
		pMenu = NULL;
		menuNum = 0;
	}
	~_Relate_Menu()
	{
		if (pMenu)
		{
			delete [](ItemMenu*)pMenu;
			pMenu = NULL;
		}
	}
}Relate_Menu;

#pragma pack()

class MenuInfo
{
public:
	MenuInfo(void);
	~MenuInfo(void);

/*	函数：	SetMenu
	用途：	设置菜单信息
	输入：
	返回：	*/
	int	SetMenu(int ColumnNum, cColumn_Info *pColumnInfo, int ParentID, int TableId, int App_type);

/*	函数：	ReleaseMenu
	用途：	删除指针空间
	输入：
	返回：	*/
	void	ReleaseMenu();

	bool	IsMenuSafe();

	bool	IsRelateMenuSafe();

/*	函数：	GetMenuShowText
	用途：	通过域信息和实际值得到菜单显示文字
	输入：
	返回：	*/
	int	GetMenuShowText(int columnId, int FieldValue, QString &MenuText);

/*	函数：	GetMenuShowTextByMenuName
	用途：	通过菜单名得到菜单显示文字
		输入：
		返回：	*/
	int GetMenuShowTextByMenuName(char *MenuName, int FieldValue, QString &MenuText);

/*	函数：	GetRelateMenuShowText
	用途：	通过域信息和实际值得到关联菜单显示文字
	输入：
	返回：	*/
	int	GetRelateMenuShowText(int RltAppType, int RltTableId, char *pRltColName, int FieldValue, QString &MenuText);

/*	函数：	GetMultiMenuText
	用途：	获得多选菜单文字信息
	输入：
	返回：	*/
	int	GetMultiMenuText(int columnId, int FieldValue, QString &MenuText);

	/*	函数：	GetMenuShowData
	用途：	通过域信息和实际值得到菜单名称和对应序号
	输入：
	返回：	*/
	//	获得当前菜单的所有字符信息
	int    GetMenu(int columnId, ItemMenu *&pItemMenu);

	/*	函数：	GetMenu
	用途：	
	输入：
	返回：	*/
	int	GetMenuInfo(Field_Menu &FieldMenuInfo,char *MenuName);

	/*	函数：	GetMenu
	用途：	
	输入：
	返回：	*/
	QString	GetMenuNameByTaskType(int TaskType);


// 	/*	函数：	GetMenuAllString
// 	用途：	获得当前菜单的所有字符信息
// 	输入：
// 	返回：	*/
// 	void	GetMenuAllString(int nFieldIndex, CStringArray &szArray);
// 
// 	/*	函数：	GetMenuAllStringSingle
// 	用途：	获得当前菜单的单选型字符信息
// 	输入：
// 	返回：	*/
// 	void	GetMenuAllStringSingle(int nFieldIndex, CStringArray &szArray);
// 
// 	/*	函数：	ChangeSingleMenu
// 	用途：	修改单选菜单的显示
// 	输入：	int PreVal, int AfterVal
// 	返回*/
// 	void	ChangeSingleMenu(int PreVal, int AfterVal);
// 
// 	/*	函数：	GetMenubShow
// 	用途：	获取菜单的显示性
// 	输入：	STRUCT_MENU_INFO *pMenu, int TableID, CString SFieldName
// 	返回*/
// 	bool	GetMenubShow(CNSA3000DB_Interface *pDataBase, STRUCT_MENU_INFO *pMenu, int TableID, int ParentID, CString SFieldName);
// 
// 	/*	函数：	GetMultiMenuText
// 	用途：	获得多选菜单文字信息
// 	输入：
// 	返回：	*/
// 	void	GetMultiMenuText(int t_col_index,int value,char *&str);
// 

// 
// 	/*	函数：	GetDoubleItemText
// 	用途：	根据实际值得到父级菜单和子菜单的显示值
// 	输入：
// 	返回：	*/
// 	int		GetDoubleItemText(int nFieldIndex,int value,char *MainName,char *SubName);
// 
// 	/*	函数：	GetMenuActualVal
// 	用途：	根据域信息和菜单索引获得实际值
// 	输入：
// 	返回：	*/
// 	int		GetMenuActualVal(short sFieldNo,int nSelIndex);
// 	/*	函数：	GetMenuSubNum
// 	用途：	
// 	输入：
// 	返回：	*/
// 	int		GetMenuSubNum(int t_col_index);

private:

/*	函数：	GetRelateMenu
	用途：	
	输入：
	返回：	*/
	//int	GetRelateMenu(Relate_Menu &FieldMenuInfo);
// 
// 	/*	函数：	GetSingleMenu
// 	用途：	获取域单选型菜单信息
// 	输入：
// 	返回：	*/
// 	int		GetSingleMenu(CNSA3000DB_Interface *pDataBase, FIELD_MENU &pMenuInfo,char* menuname, int ParentID);
// 
// 	/*	函数：	GetSubMenu
// 	用途：	
// 	输入：
// 	返回：	*/
// 	int		GetSubMenu(CNSA3000DB_Interface *pDataBase,/*CNSA3000NRealDB_SM *pRealDB,*/STRUCT_MENU_INFO *&pMenuInfo,char* menuname);

private:

	Field_Menu	*m_pFieldMenu;
	int		m_FieldMenuNum;
//	Relate_Menu *m_pRelateMenu;
//	int		m_RelateMenuNum;

};


#endif
